package homework.xuluoxi;

/*
 * 作业名称：文件拷贝
 * 作业功能：实现利用线程池将一个目录中的所有内容拷贝到另外一个目录中
 * 分　　类：目录及内容拷贝相关操作类
 * 学　　员：徐罗希
 * 版　　本：V1.0
 * 备　　注：模块四作业
 */

import java.io.*;
import java.util.concurrent.Callable;

public class FileWork implements Callable {

    // 1、定义私有成员变量，用于存放原目录与目标目录
    private String oldPath = "D:/DeleteFile";
    private String newPath = "E:/DeleteFile";

    // 2、自定义获得目标完整路径的方法
    public String getPathName(File f) {
        char[] oldArr = f.getAbsolutePath().toCharArray();
        String newPathName = newPath + new String(oldArr, oldPath.length(), oldArr.length - oldPath.length());
        return newPathName;
    }

    // 3、自定义遍历目录内容的方法
    public void fileShow(File f) throws IOException {
        File[] files = f.listFiles();
        if (null != files) {
            fileType(files);
        }
    }

    // 4、自定义判断内容类型的方法，并根据类型不同创建目录或者复制文件
    public void fileType(File[] fs) throws IOException {
        for (File f : fs) {
            if (f.isDirectory()) {
                System.out.println("正在创建目录" + f.getName());
                new File(getPathName(f)).mkdir();
                fileShow(f);
            }
            else if (f.isFile()) {
                FileOutputStream fos;
                FileInputStream fis;
                fis = new FileInputStream(f.getAbsolutePath());
                fos = new FileOutputStream(getPathName(f));
                System.out.println("正在复制" + f.getName());
                int num = 0;
                while ((num = fis.read()) != -1)
                {
                    fos.write(num);
                }
                fos.close();
                fis.close();
            }
        }
    }

    // 5、线程方法
    @Override
    public Object call() {
        System.out.println("正在创建目标根目录" + newPath);
        new File(newPath).mkdir();
        File targetFile = new File(oldPath);
        try {
            fileShow(targetFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}
